<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    function Star(name, age) {
        this.name = name 
        this.age = age 
        // 实例方法不要放在函数内部，否则每次new对象时都会创建一个function实例，应该放到构造函数的原型对象上
        // this.sing = function() {
        //     console.log('我会唱歌') // console.log(ldh.sing === zxy.sing) // false 
        // }
    }
// 不要用这种写法，原来的原型会丢失     
// Star.prototype = {
//     constructor: Star,
//     sing: function() { // 原型中的函数内部this指向的是实际调用者 
//         console.log(this.name, '我会唱歌')
//     },
//     movie: function() {
//         console.log(this.name, '我会演电影')
//     }
// }
    // 实例方法应该这样写 
    Star.prototype.sing = function() {
        console.log(this.name, '我真的会唱歌哦')
    }

    // 测试 
    let ldh = new Star('刘德华', 50)
    let zxy = new Star('张学友', 48)
    console.log(ldh.sing === zxy.sing) // true  
    ldh.sing() // 刘德华 我真的会唱歌哦 
    zxy.sing() // 张学友 我真的会唱歌哦 

    console.log(ldh.__proto__ === Star.prototype) // true 
    console.log(ldh.__proto__ === zxy.__proto__) // true 
    console.log(ldh.__proto__.constructor === Star) // true 

    console.log(Star.prototype.__proto__.constructor === Object) // true 说明Star的原型对象的原型对象是一个Object类型的对象



</script>
</html>